import json
import time

from flask import Blueprint
from application.models.users.user import *
import random,re,redis
from flask import jsonify,request,make_response,current_app
from captcha.image import ImageCaptcha #验证生成类
from werkzeug.security import generate_password_hash,check_password_hash
from tools.captcha.captcha import captcha
from tools.myredis import r
from tools.comm import sendMsg
from tools.myjwt import mjwt

user_blue = Blueprint("userblue",__name__)

# 测试
@user_blue.route("/test")
def test():
    id = request.args.get("id")
    return jsonify({
        "code": 200,
        'id': id
    })
# 获取图片验证码
@user_blue.route("/getcode")
def getcode():
    # 生成图片验证码 text文字， image图片流
    name,text,image = captcha.generate_captcha()
    # 从页面获取uuid作为redis key
    uuid = str(request.args.get('uuid'))
    # 存入redis
    r.str_add(uuid,str(text),60)
    # 以流的方式生成图片验证码
    res = make_response(image)
    res.headers['Content-Type'] = 'image/jpg'
    return res
#发送短信验证码
@user_blue.route("/sendSmsCode",methods=['POST'])
def sendSmsCode():
    data = request.data
    if data:
        data = json.loads(data)
        #获取3个参数
        uuid = data.get('uuid')
        piccode = data.get('piccode')
        mobile = data.get('mobile')
        #通过uuid查询redis
        value = r.str_get(uuid)
        if value:
        # 两个验证码对比， 如果成功调用短信平台发短信
            if piccode.lower() == value.lower():
                #验证一分钟之内只能发送一次
                mcode = r.str_get(mobile)
                if mcode:
                    return jsonify({
                        "code":10012,
                        'msg':' 一分钟内不能重复'
                    })
                #生成5随机数
                scode = random.randint(1000,9999)
                #调用短信平台
                flag = sendMsg(mobile,scode)
                if flag == True:
                    # 存入redis
                    r.str_add(mobile,scode,60)
                    # 删除图片验证码
                    r.del_str(uuid)
                    # 返回结果
                    return jsonify({
                        "code": 200,
                        'msg': '发送成功'
                    })
                else:
                    return jsonify({
                        "code": 10011,
                        'mes': "图片验证码错误"
                    })
        # 失败返回错误信息
            else:
                return jsonify({
                    "code":10010,
                    'mes':"图片验证码不存在"
                })




@user_blue.route('/login',methods=['POST'])
def login():
    #获取参数,手机号m验证码
    data = request.data
    if data:
        data = json.loads(data)
        # 获取参数
        #获取2个参数
        mcode = data.get('mcode')
        mobile = data.get('mobile')
        #根据手机号去redis获取验证码

        code = r.str_get(mobile)
        # 判断是否存在
        if code:
            print(">>>>>>>>>>>>>>>>>>>>>>>", code)
            print(">>>>>>>>>>>>>>>>>>>>", mcode)
            # 验证码是否相同
            if str(code) == str(mcode):

                # 如果相同查询数据库user表
                # 如果不相同返回错误
                # 如果存在返回用户信息
                user = User.query.filter(User.mobile == mobile).first()
                if user:
                    # 删除redis中的验证码
                    r.del_str(mobile)
                else:
                    u = User(mobile=mobile,nikename=mobile)
                    db.session.add(u)
                    db.session.commit()
                    print("注册成功")
                    user = User.query.filter(User.mobile == mobile).first()
                #用户信息生成JWT  token
                token=mjwt.encode(data={'data':{'uid':user.id,'exp':int(time.time())}})

                return jsonify({'code': 200, 'token':token,'userid':user.id})
                #返回给页面
            else:
                return jsonify({'code': 10021, 'mes': '验证码错误'})

        else:
            return jsonify({'code':10020,'mes':'前端错误'})
